//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Eic.h"
#include "uFormatsPapier.h"

#define MODULE_TAG 1000
#define MM_PER_INCH 25.4 //25.4 mm = 1 pouce
//---------------------------------------------------------------------------
__fastcall TFormatPapier::TFormatPapier()
{
TypePapier TabFormatsPapier[] =
{   {"User",                              0,      0,    POUCES},
    {"Letter (8.5 x 11 in.)",             8.5,   11,    POUCES},
    {"Letter Small (8.5 x 11 in.)",       8.5,   11,    POUCES},
    {"Tabloid (11 x 17 in.)",            11,     17,    POUCES},
    {"Ledger (17 x 11 in.)",             17,     11,    POUCES},
    {"Legal (8.5 x 14 in.)",              8.5,   14,    POUCES},
    {"Statement (5.5 x 8.5 in.)",         5.5,    8.5,  POUCES},
    {"Executive (7.25 x 10.5 in.)",       7.25,  10.5,  POUCES},
    {"A3 (297 x 420 mm)",               297,    420,    MILLIMETRES},
    {"A4 (210 x 297 mm)",               210,    297,    MILLIMETRES},
    {"A4 Small (210 x 297 mm)",         210,    297,    MILLIMETRES},
    {"A5 (148 x 210 mm)",               148,    210,    MILLIMETRES},
    {"B4 (250 x 354 mm)",               250,    354,    MILLIMETRES},
    {"B5 (182 x 257 mm)",               182,    257,    MILLIMETRES},
    {"Folio (8.5 x 13 in.)",              8.5,   13,    POUCES},
    {"Quarto (215 x 275 mm)",           215,    275,    MILLIMETRES},
    {"11 x 17 in.",                      11,     17,    POUCES},
    {"Note (8.5 x 11 in.)",               8.5,   11,    POUCES},
    {"Envelope #9 (3.875 x 8.875 in.)",   3.875,  8.875,POUCES},
    {"Envelope #10 (4.125 x 9.5 in.)",    4.125,  9.5,  POUCES},
    {"Envelope #11 (4.5 x 10.375 in.)",   4.5,   10.375,POUCES},
    {"Envelope #12 (4.25 x 11 in.)",      4.25,  11,    POUCES},
    {"Envelope #14 (5 x 11.5 in.)",       5,     11.5,  POUCES},
    {"C size sheet (17 x 22 in.)",       17,     22,    POUCES},
    {"D size sheet (22 x 34 in.)",       22,     34,    POUCES},
    {"E size sheet (34 x 44 in.)",       34,     44,    POUCES},
    {"Envelope DL (110 x 220 mm)",      110,    220,    MILLIMETRES},
    {"Envelope C5 (162 x 229 mm)",      162,    229,    MILLIMETRES},
    {"Envelope C3 (324 x 458 mm)",      324,    458,    MILLIMETRES},
    {"Envelope C4 (229 x 324 mm)",      229,    324,    MILLIMETRES},
    {"Envelope C6 (114 x 162 mm)",      114,    162,    MILLIMETRES},
    {"Envelope C65 (114 x 229 mm)",     114,    229,    MILLIMETRES},
    {"Envelope B4 (250 x 353 mm)",      250,    353,    MILLIMETRES},
    {"Envelope B5 (176 x 250 mm ",      176,    250,    MILLIMETRES},
    {"Envelope B6 (176 x 125 mm)",      176,    125,    MILLIMETRES},
    {"Envelope (110 x 230 mm)",         110,    230,    MILLIMETRES},
    {"Envelope Monarch (3.875 x 7.5 in.)",3.875,  7.5,  POUCES},
    {"6-3/4 Envelope (3.625 x 6.5 in.)",  3.625,  6.5,  POUCES},
    {"US Std Fanfold (14.875 x 11 in.)", 14.875, 11,    POUCES},
    {"German Std Fanfold (8.5 x 12 in.)", 8.5,   12,    POUCES},
    {"German Legal Fanfold (8.5 x 13 in.)",8.5,  13,    POUCES}  };
  try
  {
    slFormats = new TStringList;
    for (int i=0 ; i < sizeof(TabFormatsPapier)/sizeof(TabFormatsPapier[0]); i++)
    {
      TypePapier *tPapier = new TypePapier;
      memset(tPapier,0,sizeof(TypePapier));
      strcpy(tPapier->szNomFormat,TabFormatsPapier[i].szNomFormat);
      tPapier->x = TabFormatsPapier[i].x;
      tPapier->y = TabFormatsPapier[i].y;
      tPapier->Mesure = TabFormatsPapier[i].Mesure;
      slFormats->AddObject(TabFormatsPapier[i].szNomFormat, (TObject*)tPapier);
    }
  }
  catch(Exception &e)
  {
    EICDisplayException(TAG(10), e);
  }
}
//---------------------------------------------------------------------------
__fastcall TFormatPapier::~TFormatPapier()
{

  TypePapier *tPapier = NULL;
  try
  {
    while (slFormats->Count)
    {
      tPapier = (TypePapier*) slFormats->Objects[0];
      delete tPapier; tPapier = NULL;
      slFormats->Delete(0);
    }
    delete slFormats;     slFormats = NULL;
  }
  catch(Exception &e)
  {
    EICDisplayException(TAG(20), e);
  }
}
/*******************************************************************************

Fonction : GetTaillePapier(enum NOM_FORMAT_PAPIER eFormat, enum UNITE_MESURE eUnite)

Paramètres d'entrée :  eFormat le format du papier
                       eUnite  l'unité dans laquelle la taille va être exprimée

Paramètres de sortie :

Valeur retournée : la largeur et la hauteur du papier (sous forme de TPoint)
*******************************************************************************/
TTaillePapier  __fastcall TFormatPapier::GetTaillePapier(enum NOM_FORMAT_PAPIER eFormat, enum UNITE_MESURE eUnite)
{
  TTaillePapier Point;
  TypePapier tPapier;
  memset(&tPapier,0,sizeof(TypePapier));
  try
  {
    tPapier = *(TypePapier*) slFormats->Objects[eFormat];
    if (eUnite == tPapier.Mesure)
    {
     Point.dx = tPapier.x;
     Point.dy = tPapier.y;
    }
    else
    {
      switch (eUnite)
      {
        case POUCES :
          //Convertir les mm en pouces
         Point.dx = tPapier.x / MM_PER_INCH ;
         Point.dy = tPapier.y / MM_PER_INCH ;
          break;
        case MILLIMETRES :
          //Convertir les pouces en  mm
         Point.dx = tPapier.x * MM_PER_INCH ;
         Point.dy = tPapier.y * MM_PER_INCH ;
          break;
        default : ASSERT(false);
      }
    }
  }
  catch(Exception &e)
  {
    EICDisplayException(TAG(30), e);
  }
  return Point;
}
/*******************************************************************************

Fonction : enum   NOM_FORMAT_PAPIER __fastcall GetFormatPapier(TPoint *Pt, enum UNITE_MESURE eUnite)

Paramètres d'entrée :  eFormat le format du papier
                       eUnite  l'unité dans laquelle la taille va être exprimée

Paramètres de sortie :

Valeur retournée : la largeur et la hauteur du papier (sous forme de TPoint)
*******************************************************************************/
enum NOM_FORMAT_PAPIER __fastcall TFormatPapier::GetFormatPapier(TTaillePapier *Pt, enum UNITE_MESURE eUnite)
{
  TypePapier *tPapier = NULL;
  double LargeurMM, LargeurPouces, LongueurMM, LongueurPouces;
  try
  {
    switch (eUnite)
    {
      case POUCES :
       LargeurPouces = Pt->dx;
       LongueurPouces = Pt->dy;
       LargeurMM = (double)Pt->dx * MM_PER_INCH ;
       LongueurMM = (double)Pt->dy * MM_PER_INCH ;
        break;
      case MILLIMETRES :
       LargeurPouces = (double)Pt->dx / MM_PER_INCH;
       LongueurPouces = (double)Pt->dy / MM_PER_INCH;
       LargeurMM = (double)Pt->dx;
       LongueurMM = (double)Pt->dy;
        break;
      default : ASSERT(false);
    }

    for (int i=0 ; i < slFormats->Count; i++)
    {
      tPapier = (TypePapier*) slFormats->Objects[i];
      if ((tPapier->Mesure == POUCES      && (   tPapier->x == LargeurPouces && tPapier->y == LongueurPouces
                                              || tPapier->x == LongueurPouces && tPapier->y == LargeurPouces))
        ||(tPapier->Mesure == MILLIMETRES && (   tPapier->x == LargeurMM     && tPapier->y == LongueurMM
                                              || tPapier->x == LongueurMM     && tPapier->y == LargeurMM)))
        return (NOM_FORMAT_PAPIER)i;
    }
  }
  catch(Exception &e)
  {
    EICDisplayException(TAG(40), e);
  }
  return USER;
}

/*******************************************************************************

Fonction : TypePapier __fastcall TFormatPapier::GetTabFormatPapier(short shItem)

Paramètres d'entrée :   shItem l'indice du format du papier

Paramètres de sortie :

Valeur retournée : sPapier les caractéristiques du format
*******************************************************************************/
TypePapier __fastcall TFormatPapier::GetTabFormatPapier(short shItem)
{
TypePapier sPapier;

try
   {
   sPapier = *(TypePapier*) slFormats->Objects[shItem];	
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(30), e);
   }
return sPapier;
}




#pragma package(smart_init)
